package com.example.myapplication;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import java.util.Random;

/**
 * K线数据生成器
 * 用于生成模拟的股票K线数据
 */
public class KLineDataGenerator {
    private static final Random random = new Random();
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd", Locale.getDefault());

    /**
     * 生成指定数量的K线数据
     * @param count 数据数量
     * @param basePrice 基础价格
     * @return K线数据列表
     */
    public static List<KLineData> generateKLineData(int count, float basePrice) {
        List<KLineData> dataList = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -count);

        float currentPrice = basePrice;
        
        for (int i = 0; i < count; i++) {
            // 生成当日的开盘价（基于前一日收盘价波动）
            float open = currentPrice + (random.nextFloat() - 0.5f) * currentPrice * 0.02f;
            
            // 生成价格波动范围
            float volatility = currentPrice * (0.01f + random.nextFloat() * 0.04f); // 1%-5%的波动
            
            // 生成最高价和最低价
            float high = open + random.nextFloat() * volatility;
            float low = open - random.nextFloat() * volatility;
            
            // 确保最低价不为负数
            if (low < 0) {
                low = open * 0.95f;
            }
            
            // 生成收盘价（在最高价和最低价之间）
            float close = low + random.nextFloat() * (high - low);
            
            // 确保开盘价在合理范围内
            if (open > high) {
                open = high - random.nextFloat() * (high - low) * 0.3f;
            }
            if (open < low) {
                open = low + random.nextFloat() * (high - low) * 0.3f;
            }
            
            // 生成成交量（随机）
            long volume = (long) (50000 + random.nextInt(200000));
            
            // 格式化日期
            String date = dateFormat.format(calendar.getTime());
            
            // 创建K线数据
            KLineData kLineData = new KLineData(open, close, high, low, volume, date, calendar.getTimeInMillis());
            dataList.add(kLineData);
            
            // 更新当前价格为收盘价，用于下一天的计算
            currentPrice = close;
            
            // 日期向前推进一天
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
        
        return dataList;
    }

    /**
     * 生成趋势性K线数据
     * @param count 数据数量
     * @param basePrice 基础价格
     * @param trend 趋势方向 (1: 上涨, -1: 下跌, 0: 震荡)
     * @return K线数据列表
     */
    public static List<KLineData> generateTrendKLineData(int count, float basePrice, int trend) {
        List<KLineData> dataList = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -count);

        float currentPrice = basePrice;
        float trendFactor = trend * 0.001f; // 趋势因子
        
        for (int i = 0; i < count; i++) {
            // 应用趋势
            currentPrice += currentPrice * trendFactor * (0.5f + random.nextFloat());
            
            // 生成当日的开盘价
            float open = currentPrice + (random.nextFloat() - 0.5f) * currentPrice * 0.015f;
            
            // 生成价格波动范围
            float volatility = currentPrice * (0.008f + random.nextFloat() * 0.025f);
            
            // 生成最高价和最低价
            float high = Math.max(open, currentPrice) + random.nextFloat() * volatility;
            float low = Math.min(open, currentPrice) - random.nextFloat() * volatility;
            
            // 确保最低价不为负数
            if (low < 0) {
                low = Math.min(open, currentPrice) * 0.98f;
            }
            
            // 生成收盘价
            float close = low + random.nextFloat() * (high - low);
            
            // 根据趋势调整收盘价
            if (trend > 0) {
                // 上涨趋势，收盘价偏向高位
                close = (close + high) / 2 + (random.nextFloat() - 0.3f) * (high - low) * 0.3f;
            } else if (trend < 0) {
                // 下跌趋势，收盘价偏向低位
                close = (close + low) / 2 + (random.nextFloat() - 0.7f) * (high - low) * 0.3f;
            }
            
            // 确保价格在合理范围内
            close = Math.max(low, Math.min(high, close));
            
            // 调整开盘价
            if (open > high) open = high * 0.99f;
            if (open < low) open = low * 1.01f;
            
            // 生成成交量
            long volume = (long) (30000 + random.nextInt(150000));
            
            // 格式化日期
            String date = dateFormat.format(calendar.getTime());
            
            // 创建K线数据
            KLineData kLineData = new KLineData(open, close, high, low, volume, date, calendar.getTimeInMillis());
            dataList.add(kLineData);
            
            // 更新当前价格
            currentPrice = close;
            
            // 日期向前推进一天
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
        
        return dataList;
    }

    /**
     * 生成默认的示例K线数据
     * @return 30天的K线数据
     */
    public static List<KLineData> generateDefaultKLineData() {
        return generateTrendKLineData(30, 100.0f, 1); // 30天上涨趋势数据，基础价格100
    }
}